package GUI;

import Interaction.ServerConnection;
import java.rmi.RemoteException;
import Flightadministration.*;
import Data.*;
import Report.*;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 * 
 */
public class ReportShowSeatingPlan extends JPanel {

    final Main td;
    public JTable table;
    public DefaultTableModel model;
    public Vector<Vector> rowData;
    public Vector<String> columnNames;
    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
     *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();
    final ReportGenerator report = new ReportGeneratorImpl();


    // Konstruktor
    public ReportShowSeatingPlan(final Main td) throws java.rmi.RemoteException {
        
        this.td = td;
        showReportShowSeatingPlan();
    }
    
    
    // Methoden
    public void showReportShowSeatingPlan() throws RemoteException {

        //GridBagLayout
        //**********************************************************************

        GridBagLayout gbl = new GridBagLayout();
        this.setLayout(gbl);
        this.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren

        //Label
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Report mit sämtlichen Buchungen einer Flugdurchführung erstellen</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 3;
        this.add(headline, constraints);

        //Table
        //**********************************************************************

        // Vector erzeugen und die Bezeichnungen der Tabellenspalten hinzufügen
        columnNames = new Vector<String>();
        columnNames.add("ID");
        columnNames.add("Abflugtag");
        columnNames.add("Abflugdatum");
        columnNames.add("Abflugsuhrzeit");
        columnNames.add("Ankunftstag");
        columnNames.add("Ankunftsdatum");
        columnNames.add("Ankunftsuhrzeit");
        columnNames.add("Abflughafen");
        columnNames.add("Zielflughafen");
        columnNames.add("Fluglinie");

        // Vector mit Werten für JTable belegen
        rowData = admin.getAllFlightRealizationsForTable();

        // Tabelle erzeugen und mit Daten befüllen
        model = new DefaultTableModel(rowData, columnNames);
        table = new JTable(model) {
            @Override
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
        table.setModel(model);
        table.setAutoCreateRowSorter(true);
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 3;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.weighty = 1.0;
//        table.setPreferredScrollableViewportSize(new Dimension(400,200));
        table.setVisible(true);
        this.add( new JScrollPane(table), constraints);

        
        //Buttons
        //**********************************************************************

        JButton button_CreateReport = new JButton("Report erstellen");
        constraints.gridx = 0;
        constraints.gridy = 3;
        constraints.gridwidth = 1;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        this.add(button_CreateReport, constraints);

        JButton button_Back = new JButton("Zurück");
        constraints.gridx = 1;
        constraints.gridy = 3;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        this.add(button_Back, constraints);


        //Action Listener
        //**********************************************************************
        table.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent evt){

                //Nur auf Doppelklick der linken Mousetaste reagieren.
                if(evt.getButton() == MouseEvent.BUTTON1 && evt.getClickCount() > 1){
                    createReport();
                }
            }
        });

        button_CreateReport.addActionListener(new ActionListener() {
                @Override

            public void actionPerformed(ActionEvent e){
                    createReport();
//                // Prüfen ob keine Zeile (-1) ausgewählt wurde
//                if (table.getSelectedRow()== -1) {
//                    JOptionPane.showMessageDialog(null, "Bitte eine Spalte Auswählen");
//                }
//                else {
//                    try {
//                        // Die realizationId des ausgewählten Fluges auslesen
//                        int currentRow = table.getSelectedRow();
//                        Object currentRealizationId = table.getModel().getValueAt(currentRow, 0);
//                        String currentRealizationIdAsString = currentRealizationId.toString();
//                        int currentRealizationIdAsInt = Integer.parseInt(currentRealizationIdAsString);
//
//                        // Report erzeugen
//                        SeatallocationOfASpecificFlightRealizationReport r =
//                                report.createSeatallocationOfASpecificFlightRealizationReport(currentRealizationIdAsInt);
//                        // Report ausgeben
//                        report.outputSeatallocationOfASpecificFlightRealizationReport(r);
//
//                    } catch (RemoteException ex) {
//                            System.out.println(ex);;
//                    }
//                }
            }
        });


        button_Back.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                ((CardLayout) td.rightp.getLayout()).show(td.rightp,"InfoTextReport");
            }
        });

    }

    public void createReport() {
                // Prüfen ob keine Zeile (-1) ausgewählt wurde
                if (table.getSelectedRow()== -1) {
                    JOptionPane.showMessageDialog(null, "Bitte eine Spalte Auswählen");
                }
                else {
                    try {
                        // Die realizationId des ausgewählten Fluges auslesen
                        int currentRow = table.getSelectedRow();
                        Object currentRealizationId = table.getModel().getValueAt(currentRow, 0);
                        String currentRealizationIdAsString = currentRealizationId.toString();
                        int currentRealizationIdAsInt = Integer.parseInt(currentRealizationIdAsString);

                        // Report erzeugen
                        SeatallocationOfASpecificFlightRealizationReport r =
                                report.createSeatallocationOfASpecificFlightRealizationReport(currentRealizationIdAsInt);
                        // Report ausgeben
                        report.outputSeatallocationOfASpecificFlightRealizationReport(r);

                    } catch (RemoteException ex) {
                            System.out.println(ex);;
                    }
                }
    }

    public void updateTableData() throws RemoteException {

        // Vector mit Daten für JTable belegen
        rowData = admin.getAllFlightRealizationsForTable();

        // Tabelleninhalt wird aktualisiert
        model.setDataVector(rowData, columnNames);

    }
}
